package haoji_juc;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * @program: Dome
 * @description:
 * @className: TestAtomicDemo
 * @author: rjt99999
 * @version: 1.0.0
 * @create: 2020-08-03 15:14
 **/
public class TestAtomicDemo {
    /*
    一、i++ 的原子性问题：i++ 的操作实际上分为三个步骤“读-改-写”
 * 		  int i = 10;
 * 		  i = i++; //10
 *
 * 		  int temp = i;
 * 		  i = i + 1;
 * 		  i = temp;
 *
 * 二、原子变量：在 java.util.concurrent.atomic 包下提供了一些原子变量。
 * 		1. volatile 保证内存可见性
 * 		2. CAS（Compare-And-Swap） 算法保证数据变量的原子性
 * 			CAS 算法是硬件对于并发操作的支持
 * 			CAS 包含了三个操作数：
 * 			①内存值  V
 * 			②预估值  A
 * 			③更新值  B
 * 			当且仅当 V == A 时， V = B; 否则，不会执行任何操作。
     */


    //变量的原子性 --有相应的原子类-对变量的改写（主内存） -确保线程的安全
    public static void main(String[] args) {



        AtomicDemo atomicDemo = new AtomicDemo();


        for (int i = 0; i < 10; i++) {

            new Thread(atomicDemo).start();

        }




    }




}


class  AtomicDemo implements Runnable{


    //private  volatile  int a =10;
    //用相应的原子类-eg：integer的 ，数组的
    AtomicInteger atomicInteger = new AtomicInteger(10);


    @Override
    public void run() {


        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }


        System.out.println(getSerialNumber());


    }

    public int getSerialNumber(){

      //  return  a++;
        //调取原子类的自增方法
        return  atomicInteger.getAndIncrement();
    }
}
